// 类 class
class Person {
  // 属性声明
  name: string
  age: number

  // 构造器
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }

  // 方法
  speak() {
    console.log(`我叫: ${this.name}, 今年${this.age}岁`)
  }
}

// Person实例
const p1 = new Person('周杰伦', 38)
console.log(p1)
p1.speak()

// Student 继承 Person 
class Student extends Person {
  grade: string

  // 构造器
  constructor(name: string, age: number, grade: string) {
    super(name, age)
    this.grade = grade
  }
  // 备注: 本例中若 Student 类不需要额外的属性, Student的构造器可以省略.

  // 重写从父类继承的方法
  override speak() {
    console.log(`我是学生, 我叫：${this.name}, 今年 ${this.age}岁，在读${this.grade}年级`,)
  }

  // 子类自己的方法
  study() {
    console.log(`${this.name}正在努力学习中......`)
  }
}

const s1 = new Student('李同学', 16, '五年级')
console.log(s1)
s1.study()
s1.speak()